home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / PROGMISC / FPCDOCS.LZH / SEQFILES.DOC < prev    next >
Text File  |  1988-06-01  |  15KB  |  422 lines

  1. V.   SEQUENTIAL FILES 
  2.  
  3.  
  4.  
  5. 1.  SEQUENTIAL FILES IN F-PC
  6.  
  7.  
  8.  
  9. More than 90% of what is in F-PC came from F83, much of what you
  10. are seeing, should be somewhat familiar.  Things that are 
  11. different, are normally different because they need to be.  There 
  12. are a significant number of things about F83 that should have 
  13. been changed, but did not for compatibility reasons.  However 
  14. since BLOCK is not present and is replaced by sequential files, 
  15. you will experience a period of difficulty.  Nevertheless, many of 
  16. the familiar file manipulation words from F83 are still present, 
  17. and those that are will work in a very similar if not identical 
  18. way. Some of these are: 
  19.  
  20.  
  21.         OPEN, CLOSE, VIEW, OK, L, N, B, ED, LOAD, LIST, EDIT
  22.  
  23.  
  24. Some words like BLOCK, and BUFFER, simply could not be fit into 
  25. the new scheme of things in a logical manner, and so were omitted.  
  26. To load an entire file, use the sequence FLOAD <filename>.  
  27. Listing through a file is best done with VIEW, although of course 
  28. the file will have already had to be loaded. To LIST through a 
  29. file which has not been loaded, you can use LIST, which lists from 
  30. a line number, rather than from a block, but the following 
  31. sequence is easier.  Similar to LIST, LOAD and EDIT also take a 
  32. line number as input to start the loading or editing function in 
  33. the middle of the current file. 
  34.  
  35.                 OPEN <filename> <enter> opens file
  36.                 L <enter>               lists first 18 lines
  37.                 N <enter>               lists next group of lines.
  38.                 B <enter>               list previous group of lines.
  39.  
  40. These words are very fast using indices into the file to maintain 
  41. their line pointer information.  The word LOAD loads the rest of a 
  42. file starting at the line number specified. The compiler in F-PC
  43. has been tailored to be as fast as it could be made.  Since much 
  44. of the functionality of WORD has been moved into CODE for 
  45. performance, this system compiles sequential text files much 
  46. faster than standard F83 compiles BLOCKs. 
  47.  
  48. The editor can be used to directly convert existing BLOCK files 
  49. smaller than 64k to sequential files.  A utility is provided to 
  50. convert even very large BLOCK files into sequential files.  The 
  51. resulting savings in mass storage is typically greater than 60%. 
  52.  
  53.  
  54.  
  55. 2.  HANDLES 
  56.  
  57.  
  58.  
  59. A handle contains several fields, and words have been defined to 
  60. traverse to the various fields, here is a picture of the data 
  61. structure of a handle: 
  62.  
  63.  
  64. +0        +1                     +66            +68 
  65.  
  66. [ count ] [ path & filename 00 ] [ attributes ] [ handle ] 
  67.  
  68. 1 byte    64 bytes   +  null     2 bytes        2 bytes 
  69.  
  70. ^          ^                     ^              ^ 
  71.  
  72. |          |                     |              | 
  73.  
  74. handle     >NAM                  >ATTRIB        >HNDLE 
  75.  
  76.  
  77. Each of the words in the above line, after handle, steps from the 
  78. address returned by the handle, to the field indicated. 
  79.  
  80. The word HANDLE followed by <name> creates and initializes the 
  81. above structure. When <name> is later used, it returns the address 
  82. labeled +0 above.  
  83.  
  84. A sequential line read word LINEREAD is provided, which reads a 
  85. line at a time from the file open in SHNDL, returning an address 
  86. of a counted string which will include the CRLF characters at the 
  87. end of the line, so you will need to strip them off if you don't 
  88. want them. the LINEREAD word is used as follows: 
  89.  
  90. : sample        ( filename --- ) 
  91.    open                            \ open a file 
  92.    0.0 seek                        \ reset file pointer 
  93.    inlen off                       \ clear input 
  94.  
  95.    buffer begin   
  96.       lineread                     \ read a line, returns 
  97.                                    \ an address of counted $ 
  98.       dup c@                       \ check for length 
  99.    <>0 while   
  100.       cr count 2- type             \ type line just read 
  101.                                    \ without the CRLF chars. 
  102.    repeat  drop                    \ repeat till file empty. 
  103.    close ;                         \ close the file. 
  104.  
  105. This simple example may seem complicated, but it really is easy to 
  106. read the lines of a sequential file, and writing is just as easy. 
  107. The word LINEREAD automatically buffers the reads from disk in a 
  108. 1k buffer to minimize the number of DOS calls performed. Lines up 
  109. to 255 characters can be read with LINEREAD, longer lines or lines 
  110. not terminated by a LF will be truncated to 255 characters. 
  111.  
  112.  
  113.  
  114. 3.   HANDLE WORD SET
  115.  
  116.  
  117.  
  118. The file system interface in F-PC uses handles to talk to DOS, and
  119. only the number representing the File ID is passed to DOS from 
  120. Forth. To make the interface as simple and clean as possible, you 
  121. the Forth programmer need never deal with the details of how this 
  122. works, you only need know that handles are created with the word 
  123. HANDLE, handles are arrays within which special file information 
  124. is stored, and when a handles name is executed, it returns an 
  125. address which is the address that is passed to the handle file 
  126. control words. Word definitions and usage are as follows: 
  127.  
  128. .FILES          ( --- ) 
  129.  
  130. Print to the screen a list of the files currently open. 
  131.  
  132. .LOADED         ( --- ) 
  133.  
  134. Print a list of the files that have been loaded, This list is used 
  135. to locate the source file for a particular word that has been 
  136. compiled. 
  137.  
  138. ">$             ( char_addr count --- counted_string ) 
  139.  
  140. Drops the count, and decrements char_addr by one, to convert to a 
  141. counted string. 
  142.  
  143. $>HANDLE        ( a1 handle --- ) 
  144.  
  145. Move the COUNTED STRING a1 into the filename field of handle. 
  146.  
  147. $>EXT           ( a1 handle --- ) 
  148.  
  149. Move the counted string a1 into the extension field of handle, the 
  150. extension string should not contain a decimal point, and should be 
  151. exactly (3) three characters long. 
  152.  
  153. $HOPEN          ( a1 --- return_code ) 
  154.  
  155. Close the current file if one is open, move the counted string 
  156. from address a1 to the current handle on the handle stack. Return 
  157. the result code from DOS as return_code. 
  158.  
  159. !HCB            ( handle | text --- ) 
  160.  
  161. Picks up text from the input stream with word, and places the name 
  162. into the handle. 
  163.  
  164. ?DEF.EXT        ( --- handle ) 
  165.  
  166. Conditionally applies the extension specified in the array DEFEXT 
  167. to the filename in handle. DEFEXT is a counted string, three 
  168. characters long plus the count. 
  169.  
  170. CHARREAD        ( --- c1 ) 
  171.  
  172. Reads a character from the currently open file specified by SHNDL 
  173. @, before using this word, you will need to initialize the 
  174. sequential input buffer to empty, to force a refill from the 
  175. currently selected file, by saying; INLEN OFF This will force a 
  176. disk read on the next call to CHARREAD, assuring you get data from 
  177. the file you selected. 
  178.  
  179. CLOSE           ( --- ) 
  180.  
  181. Close the currently open file on SHNDL @, moves down one level on 
  182. the handle stack, so another file may be open after performing 
  183. this operation, but normally you will be able to operate on the 
  184. handle in SHNDL, as an empty handle after performing CLOSE. 
  185.  
  186. CLR-HCB         ( handle --- ) 
  187.  
  188. Clears the handle, to nulls, and resets the handle identifier 
  189. field to -1 to indicate no file is open. 
  190.  
  191. CURPOINTER      ( handle --- Double_current ) 
  192.  
  193. Returns the current 32-bit double pointer into the file specified 
  194. by handle. 
  195.  
  196. DEFEXT          ( --- a1 ) 
  197.  
  198. Returns the address of the default file extension that will be 
  199. applied to any file to be opened, if no extension is specified in 
  200. the filename when the HOPEN occurs. The address a1 is the address 
  201. of a 4 byte array containing a count byte, and three extension 
  202. bytes following. In no case should a string longer than 3 
  203. characters plus count be placed in DEFEXT. 
  204.  
  205. ENDFILE         ( handle --- double_end ) 
  206.  
  207. Return the double_end number which represents the length of the 
  208. file specified by handle. The file must already be open. 
  209.  
  210. EXHREAD         ( a1 n1 handle segment --- n2 ) 
  211.  
  212. Read from file handle into the buffer specified by segment and 
  213. address a1 for a length of bytes n1, return n2 the length of bytes 
  214. actually read. The file must already be open. Useful for reading 
  215. from a file into memory other than Forth's code segment. A read 
  216. from a file is limited to 65535 bytes. 
  217.  
  218. EXHWRITE        ( a1 n1 handle segment --- n2 ) 
  219.  
  220. Write from segment and address a1 for a length of n1 bytes to file 
  221. handle, return n2 the length of bytes actually written. the file 
  222. must already be open. Useful for writing from memory other than 
  223. Forth code segment to a file. A write to a file is limited to 
  224. 65535 bytes. 
  225.  
  226. FILE>TIB        ( a1 --- ) 
  227.  
  228. Move the counted string filename from address a1 to the Terminal 
  229. Input Buffer (TIB), available for use by !HCB. 
  230.  
  231. FLOAD           ( filename --- ) 
  232.  
  233. Open and load the file specified by filename. 
  234.  
  235. HANDLE          ( <hndlname> --- ) 
  236.  
  237. Create a handle with name <hndlname>. When <hndlname> is later 
  238. executed, it returns the address of the handle array created. 
  239.  
  240. HANDLE>EXT      ( handle --- a1 ) 
  241.  
  242. Steps from the handle address to the address of the file extension 
  243. in the handle, if an extension exists, else it steps to the null 
  244. following the filename. The address a1 will be the address of a 
  245. decimal point character if the file contains an extension, or the 
  246. address of a null if no extension was contained in the handle. 
  247.  
  248. HCLOSE          ( handle --- return_code ) 
  249.  
  250. Close the file currently open on handle, and return the result 
  251. code from DOS as return_code. 
  252.  
  253. HCREATE         ( handle --- return_code ) 
  254.  
  255. Create the filename specified by handle, and return the DOS result 
  256. code as return_code. 
  257.  
  258. HDELETE         ( handle --- return_code ) 
  259.  
  260. Delete the filename as specified by handle, return the result code 
  261. from DOS as return_code. 
  262.  
  263. HIDELINES       ( --- ) 
  264.  
  265. Specifies that lines loaded with FLOAD NOT be displayed to the 
  266. display screen. 
  267.  
  268. HOPEN           ( handle --- return_code ) 
  269.  
  270. Given handle the address, open the filename in it, and return the 
  271. result code from DOS as return_code. 
  272.  
  273. HREAD           ( a1 n1 handle --- n2 ) 
  274.  
  275. Read from file handle into the buffer address a1 for length of 
  276. bytes n1, return n2 the length of bytes actually read. The file 
  277. must already be open. A read from a file is limited to 65535 
  278. bytes. 
  279.  
  280. HRENAME         ( handle1 handle2 --- return_code ) 
  281.  
  282. Rename the filename specified by handle1 to be the name specified 
  283. in handle2, return the DOS result code as return_code. 
  284.  
  285. HWRITE          ( a1 n1 handle --- n2 ) 
  286.  
  287. Write from address a1 for length n1 bytes to file handle, return 
  288. n2 the length of bytes actually written. The file must already be 
  289. open. A write to a file is limited to 65535 bytes. 
  290.  
  291. LINEREAD        ( --- a1 ) 
  292.  
  293. Reads lines from the current file, prebuffered by INBUF, which 
  294. holds 1024 bytes. Returns a1 the address of OUTBUF, a 256 byte 
  295. buffer used to hold lines read. When switching to a new file, you 
  296. should use MOVEPOINTER to reset the file pointer to the beginning 
  297. of the file, and reset INLEN to zero so the next LINEREAD will 
  298. cause a read from the disk file. The read line length is limited 
  299. to 255 bytes. 
  300.  
  301. LIST            ( line_number --- ) 
  302.  
  303. List 18 lines starting at line_number from the currently open 
  304. file. See also L N B OPEN FL. 
  305.  
  306. LOAD            ( line_number --- ) 
  307.  
  308. Start loading the currently open file, at line_number. Load 
  309. through the end of the file if no errors are encountered. 
  310.  
  311. MOVEPOINTER     ( double_offset handle --- ) 
  312.  
  313. Move the filepointer into the file handle to the offset location 
  314. specified by double_offset. The file must already be open. 
  315.  
  316. PATHSET         ( handle --- f1 ) 
  317.  
  318. Checks the file contained in handle, if it does not contain a 
  319. path, then it applies the current drive and path to the handle. 
  320. Returns f1 FALSE if it succeeded, else TRUE if it failed to read 
  321. the path from DOS. 
  322.  
  323. RWMODE          ( --- a1 ) 
  324.  
  325. A variable which holds the read/write attributes for any file to 
  326. be opened by HOPEN, normally contains a two (2) for read/write, 
  327. may be set to one (1) for write only, or to zero (0) for read 
  328. only. 
  329.  
  330. SEEK            ( d1 --- ) 
  331.  
  332. Position the file pointer for the file currently open on SHNDL @, 
  333. to d1, that is SEEK to position d1. 
  334.  
  335. SEQDOWN         ( --- ) 
  336.  
  337. Close the current file on the current level of the handle stack, 
  338. and step down one level to the previous handle. The handle stack 
  339. is four levels deep. 
  340.  
  341. SEQUP           ( --- ) 
  342.  
  343. Step up one Handle on the handle stack, if there is a file open on 
  344. that stack level, close it. The stack handle is four levels deep. 
  345.  
  346. SHOWLINES       ( --- ) 
  347.  
  348. Specifies that lines loaded with FLOAD will be displayed to the 
  349. display screen. 
  350.  
  351.  
  352.  
  353. 4.  COMMAND LINE ARGUMENTS
  354.  
  355.  
  356.  
  357. Handles in F-PC now allows you to pass arguments to it on the
  358. command line, as follows; 
  359.  
  360.         C> F-PC - LL HELLO ED <return>
  361.  
  362. The above line starts forth with F-PC, the "-" symbol tells Forth
  363. that no file need be opened, the rest of the line up to <return> 
  364. is interpreted by the Forth interpreter, as Locate and List the 
  365. word HELLO, and enter the screen editor. 
  366.  
  367. Another example illustrates how the forth compiler can be started 
  368. from the command line: 
  369.  
  370.         C> F-PC META86 OK BYE <return>
  371.  
  372. Here, Forth is started with the file META86.SEQ automatically 
  373. opened, the OK starts compiling on line 1, and if the compilation 
  374. completes properly then BYE leaves Forth and returns to DOS. 
  375.  
  376.  
  377.  
  378. 4.   CONVERSION BETWEEN SEQUENTIAL AND BLOCK FILES
  379.  
  380.  
  381.  
  382. To ease your transition from F83 to F-PC, utilites are provided to
  383. convert block files used by F83 to the sequential files required 
  384. by F-PC.
  385.  
  386. When SED is given a file to edit and it cannot find CR-LF pairs 
  387. between lines, it assumes that the file is a block file and 
  388. converts it into a sequential file by inserting CR-LF after every 
  389. line of 64 characters.  However, SED cannot correctly handle files 
  390. longer than 64K bytes.  For long block files, use the utility 
  391. package BLKTOSEQ.SEQ to convert them.
  392.  
  393. The command sequence is :
  394.  
  395.                FLOAD BLKTOSEQ <enter>     \ load converter 
  396.  
  397.                CONV <filespec> <enter>
  398.  
  399. The file specified after CONV will be converted to a sequential 
  400. file of the same name with .SEQ extension.  If file specification 
  401. is not given after CONV, CONV will request a valid file name to be 
  402. converted.  CONV also assumes that the block file has shadow 
  403. blocks in its second half, brackets the text in the shadow blocks 
  404. between COMMENT: and COMMENT; , and inserts them after the 
  405. corresponding source block. 
  406.  
  407. The utility package SEQTOBLK.SEQ will do the opposite: converting 
  408. a sequential file back to a block file.  The commands are: 
  409.  
  410.                FLOAD SEQTOBLK <enter>
  411.  
  412.                CONV <enter>
  413.  
  414. CONV will request the names of the sequential and block files.  
  415. The extensions must not be given, as the sequential file defaults 
  416. to .SEQ and the block file to .SCR.  CONV does a line to line 
  417. conversions and does not try to detect boundaries between 
  418. definitions.  It tends to break long definitions and puts them in 
  419. different blocks.  However, as all experienced Forth programmers 
  420. tend to write single line short definitions, the block file thus 
  421. produced should be compilable under F83 without trouble. 
  422.